/**
 * 
 */
package br.com.skynix.tcmc.model.rh;

import java.sql.Timestamp;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

import org.hibernate.annotations.ForeignKey;

import br.com.skynix.tcmc.base.model.EntidadeAuditavel;
import br.com.skynix.tcmc.model.enumeration.SexoEnum;
import br.com.skynix.tcmc.model.enumeration.UnidadeFederativaEnum;

/**
 * @author davi
 * 
 */
@Entity
@Table(name = "tb_funcionario")
public class Funcionario extends EntidadeAuditavel {
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_funcionario_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK001_funcionario")
	private Funcionario funcionario;

	@NotNull
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "id_classe_fk", nullable = false,
			referencedColumnName = "id")
	@ForeignKey(name = "FK002_funcionario")
	private Classe classe;

	@NotNull
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "id_categoria_funcionario_fk", nullable = false,
			referencedColumnName = "id")
	@ForeignKey(name = "FK003_funcionario")
	private CategoriaFuncionario categoriaFuncionario;

	@NotNull
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "id_posicao_funcionario_fk", nullable = false,
			referencedColumnName = "id")
	@ForeignKey(name = "FK004_funcionario")
	private PosicaoFuncionario posicaoFuncionario;

	@NotNull
	@Size(max = 255)
	@Column(nullable = false, length = 255)
	private String nome;

	@NotNull
	@Size(max = 20)
	@Column(nullable = false, length = 20)
	private String cpf;

	@Size(max = 30)
	@Column(nullable = true, length = 30)
	private String rg;

	@Size(max = 30)
	@Column(nullable = true, length = 30)
	private String ctps;

	@Size(max = 255)
	@Column(nullable = true, length = 255)
	private String endereco;

	@Size(max = 5)
	@Column(nullable = true, length = 5)
	private String numero;

	@Size(max = 255)
	@Column(nullable = true, length = 255)
	private String bairro;

	@Size(max = 255)
	@Column(nullable = true, length = 255)
	private String cidade;

	@Size(max = 2)
	@Column(nullable = true, length = 2,
			columnDefinition = "CHAR(2) DEFAULT NULL")
	@Enumerated(EnumType.STRING)
	private UnidadeFederativaEnum estado;

	@Size(max = 15)
	@Column(nullable = true, length = 15)
	private String cep;

	@Size(max = 255)
	@Column(nullable = true, length = 255)
	private String complemento;

	@Column(name = "data_admissao", nullable = true)
	private Timestamp dataAdmissao;

	@Column(name = "data_nascimento", nullable = true)
	private Timestamp dataNascimento;

	@Column(name = "data_demissao", nullable = true)
	private Timestamp dataDemissao;

	@Size(max = 1)
	@Column(nullable = true, length = 1,
			columnDefinition = "CHAR(1) DEFAULT 'M'")
	@Enumerated(EnumType.STRING)
	private SexoEnum sexo;

	@NotNull
	@Size(max = 1)
	@Column(name = "estadoCivil", nullable = false, length = 1)
	@Enumerated(EnumType.STRING)
	private String estadoCivil;

	@Size(max = 255)
	@Column(name = "nome_pai", nullable = true, length = 255)
	private String nomePai;

	@Size(max = 255)
	@Column(name = "nome_mae", nullable = true, length = 255)
	private String nomeMae;

	@Size(max = 255)
	@Column(name = "nome_conjuge", nullable = true, length = 255)
	private String nomeConjuge;

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "id_tipo_sanguineo_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK006_funcrionario")
	private TipoSanguineo tipoSanguineo;

	@Size(max = 100)
	@Column(nullable = true, length = 100)
	private String nacionalidade;

	@Size(max = 15)
	@Column(name = "telefone_residencia", nullable = true, length = 15)
	private String telefoneResidencia;

	@Size(max = 15)
	@Column(name = "telefone_celular", nullable = true, length = 15)
	private String telefoneCelular;

	@Size(max = 50)
	@Column(nullable = true, length = 50)
	private String banco;

	@Size(max = 30)
	@Column(nullable = true, length = 30)
	private String agencia;

	@Size(max = 30)
	@Column(name = "conta_corrente", nullable = true, length = 30)
	private String contaCorrente;

	@Pattern(regexp = "\\b[A-Z0-9._%-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b")
	@Size(max = 200)
	@Column(nullable = false, length = 200)
	private String email;

	@Size(max = 255)
	@Column(nullable = true, length = 255)
	private String foto;

	@Column(nullable = true, columnDefinition = "TEXT DEFAULT NULL")
	private String observacao;

	@NotNull
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "id_empresa_fk", nullable = false,
			referencedColumnName = "id")
	@ForeignKey(name = "FK007_funcionario")
	private Empresa empresa;

	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name = "tb_empresa_x_funcionario", joinColumns = @JoinColumn(
			name = "id_empresa_fk", referencedColumnName = "id",
			table = "tb_empresa"), inverseJoinColumns = @JoinColumn(
			name = "id_funcionario_fk", referencedColumnName = "id",
			table = "tb_funcionario"))
	@ForeignKey(name = "FK002_empresa_x_funcionario")
	private Set<Empresa> empresas;

	/**
	 * @return the funcionario
	 */
	public Funcionario getFuncionario() {
		return funcionario;
	}

	/**
	 * @param funcionario the funcionario to set
	 */
	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}

	/**
	 * @return the classe
	 */
	public Classe getClasse() {
		return classe;
	}

	/**
	 * @param classe the classe to set
	 */
	public void setClasse(Classe classe) {
		this.classe = classe;
	}

	/**
	 * @return the categoriaFuncionario
	 */
	public CategoriaFuncionario getCategoriaFuncionario() {
		return categoriaFuncionario;
	}

	/**
	 * @param categoriaFuncionario the categoriaFuncionario to set
	 */
	public void setCategoriaFuncionario(
			CategoriaFuncionario categoriaFuncionario) {
		this.categoriaFuncionario = categoriaFuncionario;
	}

	/**
	 * @return the posicaoFuncionario
	 */
	public PosicaoFuncionario getPosicaoFuncionario() {
		return posicaoFuncionario;
	}

	/**
	 * @param posicaoFuncionario the posicaoFuncionario to set
	 */
	public void setPosicaoFuncionario(PosicaoFuncionario posicaoFuncionario) {
		this.posicaoFuncionario = posicaoFuncionario;
	}

	/**
	 * @return the nome
	 */
	public String getNome() {
		return nome;
	}

	/**
	 * @param nome the nome to set
	 */
	public void setNome(String nome) {
		this.nome = nome;
	}

	/**
	 * @return the cpf
	 */
	public String getCpf() {
		return cpf;
	}

	/**
	 * @param cpf the cpf to set
	 */
	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	/**
	 * @return the rg
	 */
	public String getRg() {
		return rg;
	}

	/**
	 * @param rg the rg to set
	 */
	public void setRg(String rg) {
		this.rg = rg;
	}

	/**
	 * @return the ctps
	 */
	public String getCtps() {
		return ctps;
	}

	/**
	 * @param ctps the ctps to set
	 */
	public void setCtps(String ctps) {
		this.ctps = ctps;
	}

	/**
	 * @return the endereco
	 */
	public String getEndereco() {
		return endereco;
	}

	/**
	 * @param endereco the endereco to set
	 */
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	/**
	 * @return the numero
	 */
	public String getNumero() {
		return numero;
	}

	/**
	 * @param numero the numero to set
	 */
	public void setNumero(String numero) {
		this.numero = numero;
	}

	/**
	 * @return the bairro
	 */
	public String getBairro() {
		return bairro;
	}

	/**
	 * @param bairro the bairro to set
	 */
	public void setBairro(String bairro) {
		this.bairro = bairro;
	}

	/**
	 * @return the cidade
	 */
	public String getCidade() {
		return cidade;
	}

	/**
	 * @param cidade the cidade to set
	 */
	public void setCidade(String cidade) {
		this.cidade = cidade;
	}

	/**
	 * @return the estado
	 */
	public UnidadeFederativaEnum getEstado() {
		return estado;
	}

	/**
	 * @param estado the estado to set
	 */
	public void setEstado(UnidadeFederativaEnum estado) {
		this.estado = estado;
	}

	/**
	 * @return the cep
	 */
	public String getCep() {
		return cep;
	}

	/**
	 * @param cep the cep to set
	 */
	public void setCep(String cep) {
		this.cep = cep;
	}

	/**
	 * @return the complemento
	 */
	public String getComplemento() {
		return complemento;
	}

	/**
	 * @param complemento the complemento to set
	 */
	public void setComplemento(String complemento) {
		this.complemento = complemento;
	}

	/**
	 * @return the dataAdmissao
	 */
	public Timestamp getDataAdmissao() {
		return dataAdmissao;
	}

	/**
	 * @param dataAdmissao the dataAdmissao to set
	 */
	public void setDataAdmissao(Timestamp dataAdmissao) {
		this.dataAdmissao = dataAdmissao;
	}

	/**
	 * @return the dataNascimento
	 */
	public Timestamp getDataNascimento() {
		return dataNascimento;
	}

	/**
	 * @param dataNascimento the dataNascimento to set
	 */
	public void setDataNascimento(Timestamp dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

	/**
	 * @return the dataDemissao
	 */
	public Timestamp getDataDemissao() {
		return dataDemissao;
	}

	/**
	 * @param dataDemissao the dataDemissao to set
	 */
	public void setDataDemissao(Timestamp dataDemissao) {
		this.dataDemissao = dataDemissao;
	}

	/**
	 * @return the sexo
	 */
	public SexoEnum getSexo() {
		return sexo;
	}

	/**
	 * @param sexo the sexo to set
	 */
	public void setSexo(SexoEnum sexo) {
		this.sexo = sexo;
	}

	/**
	 * @return the estadoCivil
	 */
	public EstadoCivilEnum getEstadoCivil() {
		return EstadoCivilEnum.getEstado(estadoCivil);
	}

	/**
	 * @param estadoCivil the estadoCivil to set
	 */
	public void setEstadoCivil(EstadoCivilEnum estadoCivil) {
		this.estadoCivil = estadoCivil.getCodigo();
	}

	/**
	 * @return the nomePai
	 */
	public String getNomePai() {
		return nomePai;
	}

	/**
	 * @param nomePai the nomePai to set
	 */
	public void setNomePai(String nomePai) {
		this.nomePai = nomePai;
	}

	/**
	 * @return the nomeMae
	 */
	public String getNomeMae() {
		return nomeMae;
	}

	/**
	 * @param nomeMae the nomeMae to set
	 */
	public void setNomeMae(String nomeMae) {
		this.nomeMae = nomeMae;
	}

	/**
	 * @return the nomeConjuge
	 */
	public String getNomeConjuge() {
		return nomeConjuge;
	}

	/**
	 * @param nomeConjuge the nomeConjuge to set
	 */
	public void setNomeConjuge(String nomeConjuge) {
		this.nomeConjuge = nomeConjuge;
	}

	/**
	 * @return the tipoSanguineo
	 */
	public TipoSanguineo getTipoSanguineo() {
		return tipoSanguineo;
	}

	/**
	 * @param tipoSanguineo the tipoSanguineo to set
	 */
	public void setTipoSanguineo(TipoSanguineo tipoSanguineo) {
		this.tipoSanguineo = tipoSanguineo;
	}

	/**
	 * @return the nacionalidade
	 */
	public String getNacionalidade() {
		return nacionalidade;
	}

	/**
	 * @param nacionalidade the nacionalidade to set
	 */
	public void setNacionalidade(String nacionalidade) {
		this.nacionalidade = nacionalidade;
	}

	/**
	 * @return the telefoneResidencia
	 */
	public String getTelefoneResidencia() {
		return telefoneResidencia;
	}

	/**
	 * @param telefoneResidencia the telefoneResidencia to set
	 */
	public void setTelefoneResidencia(String telefoneResidencia) {
		this.telefoneResidencia = telefoneResidencia;
	}

	/**
	 * @return the telefoneCelular
	 */
	public String getTelefoneCelular() {
		return telefoneCelular;
	}

	/**
	 * @param telefoneCelular the telefoneCelular to set
	 */
	public void setTelefoneCelular(String telefoneCelular) {
		this.telefoneCelular = telefoneCelular;
	}

	/**
	 * @return the banco
	 */
	public String getBanco() {
		return banco;
	}

	/**
	 * @param banco the banco to set
	 */
	public void setBanco(String banco) {
		this.banco = banco;
	}

	/**
	 * @return the agencia
	 */
	public String getAgencia() {
		return agencia;
	}

	/**
	 * @param agencia the agencia to set
	 */
	public void setAgencia(String agencia) {
		this.agencia = agencia;
	}

	/**
	 * @return the contaCorrente
	 */
	public String getContaCorrente() {
		return contaCorrente;
	}

	/**
	 * @param contaCorrente the contaCorrente to set
	 */
	public void setContaCorrente(String contaCorrente) {
		this.contaCorrente = contaCorrente;
	}

	/**
	 * @return the email
	 */
	public String getEmail() {
		return email;
	}

	/**
	 * @param email the email to set
	 */
	public void setEmail(String email) {
		this.email = email;
	}

	/**
	 * @return the foto
	 */
	public String getFoto() {
		return foto;
	}

	/**
	 * @param foto the foto to set
	 */
	public void setFoto(String foto) {
		this.foto = foto;
	}

	/**
	 * @return the observacao
	 */
	public String getObservacao() {
		return observacao;
	}

	/**
	 * @param observacao the observacao to set
	 */
	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	/**
	 * @return the empresa
	 */
	public Empresa getEmpresa() {
		return empresa;
	}

	/**
	 * @param empresa the empresa to set
	 */
	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

	/**
	 * @return the empresas
	 */
	public Set<Empresa> getEmpresas() {
		return empresas;
	}

	/**
	 * @param empresas the empresas to set
	 */
	public void setEmpresas(Set<Empresa> empresas) {
		this.empresas = empresas;
	}
}
